package com.xinggq.user.service.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xinggq.user.api.dto.UserInfoDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 用户实体类
 *
 * @author xinggq
 * @since 2024-01-01
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user")
public class SysUserEntity {

  /**
   * 用户ID，使用分布式ID生成器
   */
  @TableId(value = "id", type = IdType.ASSIGN_ID)
  private Long id;

  /**
   * 租户ID
   */
  private Long tenantId;

  /**
   * 用户名
   */
  private String username;

  /**
   * 邮箱
   */
  private String email;

  /**
   * 手机号
   */
  private String phone;

  /**
   * 密码哈希
   */
  private String passwordHash;

  /**
   * 真实姓名
   */
  private String realName;

  /**
   * 昵称
   */
  private String nickname;

  /**
   * 性别：0-未知，1-男，2-女
   */
  private Integer gender;

  /**
   * 生日
   */
  @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
  private LocalDate birthday;

  /**
   * 状态：1-正常，0-禁用，-1-删除
   */
  private Integer status;
  /**
   * 最后登录时间
   */
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  private LocalDateTime lastLoginTime;

  /**
   * 最后登录IP
   */
  private String lastLoginIp;

  /**
   * 将用户实体转换为用户信息DTO
   *
   * @return 用户信息DTO
   */
  public UserInfoDTO toUserInfoDTO() {
    UserInfoDTO userInfo = new UserInfoDTO();
    userInfo.setId(this.getId());
    userInfo.setTenantId(this.getTenantId());
    userInfo.setUsername(this.getUsername());
    userInfo.setEmail(this.getEmail());
    userInfo.setPhone(this.getPhone());
    userInfo.setRealName(this.getRealName());
    userInfo.setNickname(this.getNickname());
    userInfo.setGender(this.getGender());
    userInfo.setBirthday(this.getBirthday());
    userInfo.setStatus(this.getStatus());
    userInfo.setLastLoginTime(this.getLastLoginTime());
    userInfo.setLastLoginIp(this.getLastLoginIp());

    return userInfo;
  }

  /**
   * 登录次数
   */
  private Integer loginCount;

  /**
   * 密码更新时间
   */
  private LocalDateTime passwordUpdateTime;

  /**
   * 创建人ID
   */
  private Long createdBy;

  /**
   * 创建时间
   */
  private LocalDateTime createdAt;

  /**
   * 更新人ID
   */
  private Long updatedBy;

  /**
   * 更新时间
   */
  private LocalDateTime updatedAt;

  /**
   * 设置创建信息
   */
  public void setCreateInfo(Long userId) {
    LocalDateTime now = LocalDateTime.now();
    this.createdAt = now;
    this.updatedAt = now;
    this.createdBy = userId;
    this.updatedBy = userId;
    if (this.status == null) {
      this.status = 1; // 默认正常状态
    }
  }

  /**
   * 设置更新信息
   */
  public void setUpdateInfo(Long userId) {
    this.updatedAt = LocalDateTime.now();
    this.updatedBy = userId;
  }

  /**
   * 检查用户是否有效
   */
  public boolean isValid() {
    return this.status != null && this.status == 1;
  }

  /**
   * 检查用户是否被删除
   */
  public boolean isDeleted() {
    return this.status != null && this.status == -1;
  }
}